  header{
	package damas;
	import java.util.*;
	import java.lang.*;
	import java.io.*;
}

/**
 * Clase Anasin
 * Realiza el analisis Sintactico
 * @author Claudia Luque | Vanesa Gonzalez | Juan Jesus Fernandez |
 * Adrian Bellido | Jose Antonio Marin
 */
class Anasin extends Parser;  

options{ 
 importVocab = Analex;   // Importacion del conjunto de tokens
 k = 6;

}

programa:  
   codigo 
	;

codigo:
	// begingame
	B E G I N G A M E {Procesador.println(1,"INICIO JUEGO!");}
		definicion
		accion
	// endgame
	E N D G A M E 
	;
	
definicion:
	// begindef
	B E G I N D E F 
		(ordenesdef)* 
	// enddef
	E N D D E F
	;

accion:
	// beginact
	B E G I N A C T 
		(ordenesact)* 
	// endact
	E N D A C T
	;
 
ordenesdef {String l1,l2,l3,l4;}:
	// randomboard(n,n,L);   L=letra MAYUSCULA
	 R A N D O M B O A R D PARENT_AB l1=numero l2=error3 COMA l3=letra error1 {Procesador.anadirFuncion("1",l1,l2,l3,""); }
	// initiateboard(L);
	| I N I T I A T E B O A R D  l1=error2 error1  { Procesador.anadirFuncion("2",l1,"","",""); }
	// loadstate();
	| L O A D S T A T E   PARENT_AB (l4=error4)* error1 { Procesador.anadirFuncion("3","","","","");}
	;
   
ordenesact {String l4,l5,l6,l7,l8,l9;}:
	// addpiece(L,L,n);
	A D D P I E C E   l4=error2 COMA l5=letra COMA l6=numero error1 { Procesador.anadirFuncion("4",l4,l5,l6,"");}
	// setuppiecce(L,n,L,n);
	| S E T U P P I E C E   l4=error2 l5=error3 COMA l6=letra COMA l7=numero error1 { Procesador.anadirFuncion("5",l4,l5,l6,l7);}
	// removepiece(L,n);
	| R E M O V E P I E C E   l4=error2 COMA l5=numero error1 { Procesador.anadirFuncion("6",l4,l5,"",""); System.out.println("ESTOY AQUi");}
	//generate3dboard();
	| G E N E R A T E NUMERO D B O A R D PARENT_AB (l4=error4)* error1 { Procesador.anadirFuncion("7","","","","");}
	//wmoveplayer(L,n,L,n);
	| W M O V E P L A Y E R PARENT_AB l4=letra l5=error3 COMA l6=letra l7=error3 error1 { Procesador.anadirFuncion("8",l4,l5,l6,l7);}
	//bmoveplayer(L,n,L,n);
	| B M O V E P L A Y E R   l4=error2 l5=error3 COMA l6=letra l7=error3 error1 { Procesador.anadirFuncion("9",l4,l5,l6,l7);}
	//wrandomlymove();
	| W R A N D O M L Y M O V E PARENT_AB (l4=error4)* error1 { Procesador.anadirFuncion("10","","","","");}
	//brandomlymove();
	| B R A N D O M L Y M O V E PARENT_AB (l4=error4)* error1  {Procesador.anadirFuncion("11","","","","");}
	//state();
	| S T A T E PARENT_AB (l4=error4)* error1 { Procesador.anadirFuncion("12","","","","");}
	//movementslist();
	| M O V E M E N T S L I S T PARENT_AB (l4=error4)* error1 { Procesador.anadirFuncion("13","","","","");}
	//3dstate();
	// Aqui habia un error, he creado el simbolo no terminal "letras" para que no haya conflicto
	| NUMERO D S T A T E  PARENT_AB (l4=error4)* error1 { Procesador.anadirFuncion("14","","","","");}
	//check(L);
	| C H E C K l4=error2 error1 { 	Procesador.anadirFuncion("15",l4,"","","");}
	// exist(L,n);
	| E X I S T   l4=error2 COMA l5=numero error1 { Procesador.anadirFuncion("16",l4,l5,"","");}
	//damadoble(L,n);
	| D A M A D O B L E  l4=error2 l5=error3 error1 { Procesador.anadirFuncion("17",l4,l5,"","");}
	//piececolor(L,n);
	| P I E C E C O L O R  l4=error2 l5=error3 error1 { Procesador.anadirFuncion("18",l4,l5,"","");}
	//ratio(L);
	| R A T I O l4=error2 error1 { 	Procesador.anadirFuncion("19",l4,"","","");}
	;
	
	
numero returns [String n=""]:
	e:NUMERO {n=new String(e.getText());}
	;
	
letra returns [String l=""]:
	e:LETRA  {l= new String(e.getText());}
   ;

letras returns [String l=""]:
	e:CADENA {l= new String(e.getText());}
	;
	
error1: //error falta ;
	  PARENT_CE PCOMA 
	| PARENT_CE {Procesador.println(0," /! Falta ';'");}
	;
	
error2 returns[String l=""]: //falta parametro letra
	PARENT_AB l30:LETRA  {l= new String(l30.getText());}
	| PARENT_AB { Procesador.println(0," /! Falta el parametro letra.");}
	;

error3 returns[String res="";] : // falta parametro numero o ,
	COMA n30:NUMERO {res=new String(n30.getText());}
	| COMA {Procesador.println(0," /! Falta un parametro numero...");}
	| n31:NUMERO {res=new String(n31.getText());} {Procesador.println(0," /! Falta una ',' delante del numero "+res);}
	;
	
error4 returns[String res="";] : // La funcion no admite parametros
	e:LETRA {res=new String(e.getText());
		if(res!=null) Procesador.println(0," /! Esta funcion no admite parametros");} 
	|e1:NUMERO {res=new String(e1.getText());
		if(res!=null) Procesador.println(0," /! Esta funcion no admite parametros");} 
;
	

 
// http://www.uco.es/~ma1fegan/Comunes/manuales/pl/ANTLR/Aclaraciones-y-Ejercicios-Resueltos-Analisis-Sintactico.pdf




                              
